
## 计算机指令的组成

一条指令由<RedSpan>操作码和操作数</RedSpan>两部分组成，操作码<RedSpan>决定要完成的操作</RedSpan>，操作数指的<RedSpan>参加运算的数据机器所在的单元地址</RedSpan>。

在计算机中，操作要求和操作数地址都由二进制数码表示，分别称为操作码和地址码，整条指令以二进制编码的形式存放在存储器中。

![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/site/20241226135823072.png)

## 计算机指令执行过程

分为<RedSpan>取指令 $\rightarrow$ 分析指令 $\rightarrow$ 执行指令</RedSpan>三个步骤，首先将程序计数器 PC 中的指令地址取出，送入地址总线， CPU 依据指令地址去内存中取出指令内容存入指令寄存器 IR；而后由指令译码器 ID 进行分析，分析指令操作码；最后执行指令，取出指令执行所需的源操作数。


## 寻址方式
指令的寻址方式和指令操作数的寻址方式是不同的。指令的寻址方式是如何找到下一条要执行的指令；指令操作数的寻址方式是指令执行过程中取操作数的。
###  指令寻址方式

* <RedSpan>顺序寻址方式</RedSpan>：（指令的地址存放在 PC 中） 当执行一段程序时，一条指令接着一条指令地顺序执行。
* <RedSpan>跳跃寻址方式</RedSpan>：指下一条指令的地址码<RedSpan>不是由程序计数器给出，而是本条指令直接给出</RedSpan>。程序跳跃后，按新的指令地址开始顺序执行。因此，程序计数器的内容也必须相应地改变，以便及时跟踪新的指令地址。


### 指令操作数寻址方式
* <RedSpan>立即寻址方式</RedSpan>：指令的地址码字段指出的不是地址，而是操作数本身。
* <RedSpan>直接寻址方式</RedSpan>：在指令的地址字段中直接中指出操作数在主存中的地址。
* <RedSpan>间接寻址方式</RedSpan>：指令地址码字段所指向的存储单元中存储的是操作数的地址。
* <RedSpan>寄存器寻址方式</RedSpan>： 指令中的地址是寄存器的编号。
* <RedSpan>基址寻址方式</RedSpan>：将基址寄存器的内容加上指令中的形式地址而形成的操作数的有效地址，其优点是可以扩大寻址能力。
* <RedSpan>变址寻址方式</RedSpan>：和基址寻址方式很相似，它是将变址寄存器的内容加上指令中的形式地址而形成操作数的有效地址。

## 指令系统

* CISC 是 <RedSpan>复杂指令系统</RedSpan>，兼容性强、指令繁多、长度可变，由微程序实现；
* RISC 是 <RedSpan>精简指令系统</RedSpan>，指令少、使用频率接近，主要依靠硬件实现（通用寄存器、硬布线控制逻辑）。


| 指令系统类型 | 指令                                                 | 寻址方式  | 实现方式                       | 其它            |
|--------|----------------------------------------------------|-------|----------------------------|---------------|
| CISC   | 数量多、使用频率差别大                                        | 支持多种  | 微程序控制技术（微码）                | 研制周期长         |
| RISC   | 数量少、使用频率接近、定长格式，大多数为单周期指令，操作寄存器，只有 Load/Store 操作内存 | 支持方式少 | 增加了通用寄存器；硬布线逻辑控制为主；适合采用流水线 | 优化编译，有效支持高级语言 |

## 指令流水线


### 原理
将<RedSpan>指令分成不同段，每段由不同的部分去处理</RedSpan>，因此可以产生叠加的效果，所有的部件取处理指令的不同段。
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241226224940.png"/>

下图是未使用流水线执行指令情况：
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241226224306.png"/>

下图是使用流水线执行指令情况：
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241226224417.png"/>

### RISC 中的流水线技数

:::tip
RISC 中使用的才是流水线技术，CISC 中使用的不是流水线技术。
:::
* <RedSpan>超流水线（Super Pipe Line）技术</RedSpan>。通过细化流水、增加级数和提高主频，使得每个机器周期内能完成一个甚至两个浮点操作。其实质是<RedSpan>以时间换空间</RedSpan>。
* <RedSpan>超标量（Super Scalar）技术</RedSpan>。它通过内装多条流水线来同时执行多个处理，其时钟频率虽然与一般流水线接近，却有更小的 CPI。其实质是<RedSpan>以空间换取时间</RedSpan>。
* <RedSpan>超长指令字（Very Long Instruction Word，VLIW）技术</RedSpan>。VLIW 和超标量都市 20 时机 80 年代出现的概念，其共同点是要同时执行多条指令，其不同在于超标量依靠硬件来实现并行处理的调度，VLIW 则充分发挥<RedSpan>软件的作用</RedSpan>，而使硬件简化，性能提高。

### 流水线的时间计算

* <RedSpan>流水线周期</RedSpan>：指令分成不同执行段，其中执行时间最长的段为流水线周期。
* <RedSpan>流水线执行时间</RedSpan>：1 条指令的总执行时间 + (总指令条数 - 1) $\times$ 流水线周期。
* <RedSpan>流水线吞吐率</RedSpan>：吞吐率即单位时间内执行指令的条数 = <RedSpan>指令条数 $\div$ 流水线执行时间</RedSpan>
* <RedSpan>流水线的加速比计算</RedSpan>：加速比即使用流水线后的效率提升度，即比不使用流水线快了多少倍，越高表明流水线效率越高。<RedSpan>公式：不使用流水线的执行时间 $\div$ 使用流水线的执行时间</RedSpan>

